package proyecto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.Pelicula;


public class PeliculaDAOImpl extends HibernateDaoSupport implements PeliculaDAO1{

	// 
	protected Log log = LogFactory.getLog(getClass());

	private DataSource dataSource;

	//conexion con la bd
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	// 
	@SuppressWarnings("unchecked")

	public List<Pelicula> buscarPorTitulo2(String titulo) throws DAOExcepcion {
		log.info("buscarPorTitulo() : " + titulo);
		List<Pelicula> arreglo = new ArrayList<Pelicula>();
		try {
			arreglo = getHibernateTemplate().find(
				"from Pelicula a where trim(a.titulo) like ?",
				"%" + titulo + "%");
		} 
		catch (Exception e) {
			log.error(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		}
	return arreglo;
	}

	public Collection<Pelicula> buscarPorNombre(String nombre)
		throws DAOExcepcion {
			String query = "select idPelicula, titulo from Pelicula where titulo like ?";
			Collection<Pelicula> lista = new ArrayList<Pelicula>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Pelicula vo = new Pelicula();
				vo.setIdPelicula(rs.getInt("idPelicula"));
				vo.setTitulo(rs.getString("titulo"));				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
		try {
			rs.close();
			stmt.close();
			con.close();
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}
	System.out.println(lista.size());
	return lista;
	}

	@SuppressWarnings("unchecked")
	public List<Pelicula> listar() throws DAOExcepcion {
		log.info("listar()");
		List<Pelicula> lista = new ArrayList<Pelicula>();
		try {
			lista = getHibernateTemplate().find("from Pelicula");
		} catch (DataAccessException e) {
			log.error(e.toString());
			throw new DAOExcepcion(e.getMessage());
		}
		return lista;
	}

	public Pelicula obtener(int idPelicula) throws DAOExcepcion {
		log.info("obtener() : " + idPelicula);
		Pelicula modelo = new Pelicula();
		try {
			modelo = (Pelicula) getHibernateTemplate().find(
					"from Pelicula a where trim(a.idPelicula) = ?",
					idPelicula + "").get(0);
		} catch (Exception e) {
			log.error("Error: " + e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public Pelicula actualizar(Pelicula modelo) throws DAOExcepcion {
	try {
		getHibernateTemplate().update(modelo);
		getHibernateTemplate().flush();
	} catch (Exception e) {
		log.error(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	}
	return modelo;
	}

	public Pelicula insertar(Pelicula modelo) throws DAOExcepcion {
	try {
		getHibernateTemplate().save(modelo);
		getHibernateTemplate().flush();
	} catch (Exception e) {
		log.error(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	}
	return modelo;
	}

	public void eliminar(int idPelicula) throws DAOExcepcion {
		Pelicula modelo = new Pelicula();
		modelo.setIdPelicula(idPelicula);
		try {
			getHibernateTemplate().delete(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
	}

}


